#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <dlfcn.h>
#include <pthread.h>
#include <linux/fb.h>

int main(int argc, char const *argv[])
{
    pid_t a = fork(); // 对于父进程而言，a就是其子进程的ID（大于0的整数）

    if(a > 0)
    {
        // 阻塞等待回收子进程的资源（还可以顺便获得子进程的退出状态status）
        // int status;
        // wait(&status); // 等价于 waitpid(-1, &status, 0)

        // if(WIFEXITED(status))
        // {
        //     printf("子进程正常退出，退出值是：%d\n", WEXITSTATUS(status));
        // }
        // else if(WIFSIGNALED(status))
        // {
        //     printf("子进程被信号杀死，信号是：%d\n", WTERMSIG(status));
        // }
        
        // 若子进程已退出那么立刻回收资源，否则不管他立即返回，不阻塞
        int status;
        while(1)
        {
            if(waitpid(a, &status, WNOHANG) > 0)
            {
                if(WIFEXITED(status))
                {
                    printf("子进程正常退出，退出值是：%d\n", WEXITSTATUS(status));
                }
                else if(WIFSIGNALED(status))
                {
                    printf("子进程被信号杀死，信号是：%d\n", WTERMSIG(status));
                }
                break;
            }
            else
            {
                printf("子进程尚未退出\n");
            }
            sleep(1);
        }


    }

    if(a == 0)
    {
        printf("PID: %d, PPID: %d\n", getpid(), getppid());
        pause();
    }

    return 0;
}
